package controleur;

import java.awt.Point;
import java.awt.event.MouseEvent;
import modele.Joueur;
import modele.Plateau;
import modele.case_.Case;
import modele.pion.Pion;
import vue.AireDeJeu;
import vue.Fenetre;

/**
 * L'écouteur de souris utilisé lors de la pose des pions sur le plateau
 *
 * @author twane
 */
public class EcouteurDeSourisEdition extends EcouteurDeSouris {

	private Class pionCourant;
	private boolean j1Fini;
	private boolean j2Fini;

	/**
	 * Crée un écouteur de souris en fonction de l'aire qu'il observe
	 *
	 * @param aire	aire que l'écouteur va écouteur
	 * @param plateau plateau contenu dans l'aire de jeu
	 * @param j1 joueur 1
	 * @param j2 joueur 2
	 * @param fenetre
	 */
	public EcouteurDeSourisEdition(AireDeJeu aire, Plateau plateau, Joueur j1, Joueur j2, Fenetre fenetre) {
		super(aire, plateau, j1, j2, fenetre);
		this.fenetre = fenetre;
		j1Fini = false;
		j2Fini = false;
	}

	/**
	 * Défini le pion qui est selectionné par le joueur et qui va être
	 * positionné
	 *
	 * @param pionCourant le pion que le joueur veut placer
	 */
	public void setPionCourant(Class pionCourant) {
		this.pionCourant = pionCourant;
	}

	@Override
	public void mouseCaseChange(MouseEvent e, Case c) {
		super.mouseCaseChange(e, c);
		aire.actualiserBuffers();
		if (c != null && c.getPion() == null) {
			Pion pion = Pion.getTypePion(pionCourant);
			aire.afficherImage(pion.getBufferedImage(), c);
		}
	}

	@Override
	public void joueurSuivant() {

		if (j1Fini && j2Fini) {
			fenetre.passerEnPartie();
			aire.effacerZoneDeplacement();
		} else {
			if (joueurCourant == j1) {
				if (!j1.peutAcheterPion(j1.getEpoque().getPionMoinsCher())) {
					j1Fini = true;
					joueurCourant = j2;
					fenetre.inverserPanelJoueur();
					joueurSuivant();
				} else {
					if (!j2Fini) {
						joueurCourant = j2;
						fenetre.inverserPanelJoueur();
					} else {
						fenetre.actualiserPanelJoueur();
					}
				}
			} else if (joueurCourant == j2) {
				if (!j2.peutAcheterPion(j2.getEpoque().getPionMoinsCher())) {
					j2Fini = true;
					joueurCourant = j1;
					fenetre.inverserPanelJoueur();
					joueurSuivant();
				} else {
					if (!j1Fini) {
						joueurCourant = j1;
						fenetre.inverserPanelJoueur();
					} else {
						fenetre.actualiserPanelJoueur();
					}
				}
			}
		}
	}

	/**
	 * Indique que le joueur qui posait son pion vient de terminer la dépose de
	 * tous ses pions
	 */
	public void jCourantFini() {
		if (joueurCourant == j1) {
			j1Fini = true;
			joueurSuivant();
		} else {
			j2Fini = true;
			joueurSuivant();
		}
	}

	@Override
	protected void clicGaucheCase(Point caseCliquee) {
		Case c = plateau.getCase(caseCliquee);
		if (c != null) {
			Pion pion = Pion.getTypePion(pionCourant);
			if (joueurCourant.peutAcheterPion(pion) && c.getPion() == null && pion.peutAcceder(c)) {
				if (plateau.isPositionnable(c.getCoord(), joueurCourant)) {
					c.setPion(pion);
					pion.setJoueur(joueurCourant);
					joueurCourant.ajouterPion(pion);
					joueurSuivant();
					aire.actualiserBuffers();
					fenetre.actualiserMiniMap();
				}
			}
		}
	}
}